<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    // 定义一个构造器
    // 有一个属性 guanjia
    // 有两个方法： $on, $off, $emit
    function EventBus(){
      this.guanjia = {
        // a: [],
        // b: []
      }
    }

    // 添加观察者 fn, 它观察eventName事件
    EventBus.prototype.$on = function (eventName, fn) {
      // 如果在事件中心已经注册过
      if (this.guanjia[eventName]) {
        this.guanjia[eventName].push(fn)
      } else {
        this.guanjia[eventName] = [ fn ]
      }
    }
    // 发布事件，执行相应的观察者函数
    EventBus.prototype.$emit = function (eventName) {
      if (this.guanjia[eventName]) {
        this.guanjia[eventName].forEach(fn => {
          fn()
        })
      }
    }
      
    // 事件总线 EventBus
    const app = new EventBus();
    // 监听事件。 添加一个观察者，对事件a感兴趣
    app.$on('a',()=>{
      console.log('a1')
    })
    // 添加一个观察者，对事件a感兴趣
    app.$on('a',()=>{
      console.log('a2')
    })
    // 添加一个观察者，对事件a感兴趣
    app.$on('b',()=>{
      console.log('b1')
    })

    app.$on('b',()=>{
      console.log('b2')
    })
    // 发布事件,事件名是a,所有的对a事件感兴趣的观察者都会执行
    app.$emit("a");   

  </script>
</body>
</html>